package org.example.netty.WebSocket;

import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpServerCodec;
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
import io.netty.handler.stream.ChunkedWriteHandler;

public class WebSocketChannelInitializer extends ChannelInitializer<SocketChannel> {
    @Override
    protected void initChannel(SocketChannel ch) throws Exception {
        ChannelPipeline pipeline =ch.pipeline();
        pipeline.addLast(new HttpServerCodec());
        // ChunkedWriteHandler    向客户端发送数据时，会将数据分成若干块，并发送给客户端， 这样可以防止发送大数据时，客户端一次性接收不完，而导致内存溢出
        //  当服务器向客户端发送数据时，如果客户端请求的是长连接，那么服务器会将数据分成若干块，然后发送给客户端,  客户端收到后，会将这些数据块组装成完整的数据，然后再进行处理,  这样可以防止客户端一次性接收不完，而导致内存溢出
        pipeline.addLast(new ChunkedWriteHandler());
        //  HttpObjectAggregator  聚合器，将多个HttpContent聚合成一个FullHttpRequest或者FullHttpResponse，  然后向下一个InboundHandler传递
        //  聚合器的最大缓冲区大小是10*1024, 如果传输的内容超过了10k，则抛出TooLongFrameException,  如果设置为0，则表示无限制,  如果设置为-1，则表示使用默认值， 默认值是1024*1024
        pipeline.addLast(new HttpObjectAggregator(8192));
        //  WebSocketServerProtocolHandler   用于处理WebSocket协议的握手请求，  握手请求的路径是/ws
        //  WebSocketServerProtocolHandler 是一个InboundHandler,  所以需要放在HttpObjectAggregator后面
        pipeline.addLast(new WebSocketServerProtocolHandler("/ws"));

        pipeline.addLast(new TextWebSocketFrameHandler());
    }
}
